home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / asm / alib11b.zip / CODE1.ZIP / DISKINFO / TRANSFER.ASM < prev   
Assembly Source File  |  1994-10-04  |  7KB  |  272 lines

  1. ;-----------------------------------------------------------------------
  2. ; LOW LEVEL DISK DRIVERS
  3. ;-----------------------------------------------------------------------
  4. ;  INPUTS -  ax=cluster#
  5. ;            es=storage area
  6. ;            cx=number of clusters to read
  7. ;
  8. ;   OUTPUT - carry set if error
  9. ;            all registers destroyed except for segment registers
  10. ;
  11. read_clusters:
  12.     test    ax,07
  13.     jnz    rcs4                ;jump if not display trigger
  14.     push    ax
  15.     push    bx
  16.     push    si
  17.     mov    dx,display_position3
  18.     call    display_dec_word_at_posn
  19.     pop    si
  20.     pop    bx    
  21.     pop    ax    
  22. rcs4:    sub    ax,2                ;force cluster count range (0 +)
  23.     mul    cs:sectors_per_cluster        ;compute sector#
  24.     sub    bp,bp
  25.     add    ax,cs:boot_fat_dir_size        ;add number sectors in header
  26.     adc    bp,dx                ;add in carry
  27.     push    ax                ;save sector#
  28.     mov    ax,cx
  29.     mul    cs:sectors_per_cluster        ;compute # of sectors to read
  30.     mov    cx,ax                ; -cx- = # of sectors to read
  31.     pop    dx                ; -dx- = sector #
  32.     sub    bx,bx                ;set buffer offset to zero
  33.     call    read_sectors
  34.     ret
  35. ;-------------------------------------------------------------------------
  36. ; read sectors
  37. ;  inputs:  cs:drive_number  
  38. ;           es:bx = buffer
  39. ;           cx = number of sectors to read
  40. ;        bp = relative sector number (high word)
  41. ;           dx = relative sector number (low word)
  42. ;  outputs: carry set if error
  43. ;
  44.  
  45. read_sectors:
  46.     push    si
  47.     push    di
  48.     push    ds
  49.     mov    al,cs:drive_number
  50.     mov    cs:buffer_sav,bx
  51.     mov    cs:seg_sav,es
  52.     mov    cs:count_sav,cx
  53.     mov    cs:sector_adr_sav,dx
  54.     mov    cs:sector_adr_sav+2,bp
  55.     push    es
  56.     pop    ds
  57.     int    25h            ;absoulute read
  58.     inc    sp            ;clear stack
  59.     inc    sp            ;clear stack
  60.     cld                ;restore direction
  61.     jnc    read_sectors_exit1    ;jmp if read ok
  62. ;
  63. ; first read failed.  If this is a DOS4+ extended partition (over 33meg) then
  64. ; we must use an alternate format for int 25
  65. ;
  66.     push    cs
  67.     pop    ds
  68.     mov    al,cs:drive_number    
  69.     mov    bx,offset dos4_int25_pkt
  70.     mov    cx,-1            ;sector# not here
  71.     int    25h            ;absoulute read
  72.     pop    ax            ;clear stack
  73.     cld                ;restore direction
  74.     jnc    read_sectors_exit1
  75.     mov    cs:bad_sector,dx        ;save bad sector#
  76.     cmp    cs:test_mode,0            ;check if real thing
  77.     je    read_sectors_exit1        ;  and keep going if it is
  78.     or    cs:abort_flag,1
  79.     stc
  80. read_sectors_exit1:
  81.     pop    ds
  82.     pop    di
  83.     pop    si
  84. read_exit:
  85.     ret
  86. ;---------------------
  87. ; read cluster using fat
  88. ;   INPUTS - ax = fat ptr
  89. ;            es = storage area
  90. ;            
  91. ;   OUTPUT - carry set if error
  92. ;            ax = ffff if last read was at end of fat chain.
  93. ;                 else, ax points at next fat entry
  94. ;
  95. read_using_fat:
  96.     push    es
  97.     call    fat_lookup            ;look up cluster in fat
  98.     pop    es
  99.     push    bx                ;save  next cluster number
  100.     mov    cx,1                ;read one cluster
  101.     call    read_clusters
  102.     pop    ax                ;get next cluster number
  103.     ret
  104.  
  105. ;---------------------
  106. ;  INPUTS -  ax=cluster#
  107. ;            es=storage area
  108. ;            cx=number of clusters to write
  109. ;  OUTPUT - carry set if error
  110. ;           all registers destroyed except for ES & DS
  111. ;
  112. write_clusters:
  113.     test    ax,07
  114.     jnz    wcs4                ;jump if not display trigger
  115.     push    ax
  116.     push    bx
  117.     push    si
  118.     mov    dx,display_position1
  119.     call    display_dec_word_at_posn
  120.     pop    si
  121.     pop    bx    
  122.     pop    ax    
  123. wcs4:    sub    ax,2                ;force cluster count range (0 +)
  124.     mul    cs:sectors_per_cluster        ;compute sector#
  125.     sub    bp,bp
  126.     add    ax,cs:boot_fat_dir_size        ;add number sectors in header
  127.     adc    bp,dx                ;add any carry
  128.     push    ax                ;save sector#
  129.     mov    ax,cx
  130.     mul    cs:sectors_per_cluster        ;compute # of sectors to write
  131.     mov    cx,ax                ; -cx- = # of sectors to write
  132.     pop    dx                ; -dx- = sector #
  133.     call    write_sectors
  134.     ret
  135. ;--------------------------- 
  136. ;  INPUTS -   cx = number of sectors to write
  137. ;             bp,dx = sector number 
  138. ;          es:bx = data buffer 
  139. ;            drive_number   
  140. ;  OUTPUTS-  carry set if error
  141. write_sectors: 
  142.     push    si
  143.     push    di
  144.     push    ds
  145.     cmp    cs:test_mode,0            ;check if test mode
  146.     jnz    write_bypass            ;  and skip write if true
  147.     sub    bx,bx
  148.     mov    al,cs:drive_number
  149.     mov    cs:buffer_sav,bx
  150.     mov    cs:seg_sav,es
  151.     mov    cs:count_sav,cx
  152.     mov    cs:sector_adr_sav,dx
  153.     mov    cs:sector_adr_sav+2,bp
  154.     push    es
  155.     pop    ds
  156.     int    26h            ;absoulute write
  157.     inc    sp            ;clear stack
  158.     inc    sp            ;clear stack
  159.     cld                ;restore direction
  160.     jnc    writ_exit        ; jmp if read ok
  161. ;
  162. ; first writ failed.  If this is a DOS4+ extended partition (over 33meg) the
  163. ; we must use an alternate format for int 25
  164. ;
  165.     push    cs
  166.     pop    ds
  167.     mov    al,cs:drive_number
  168.     mov    bx,offset dos4_int25_pkt
  169.     mov    cx,-1            ;sector# not here
  170.     int    26h            ;absoulute read
  171.     pop    ax            ;clear stack
  172.     cld                ;restore direction
  173.     jnc    writ_exit
  174.     mov    cs:bad_sector,dx
  175.     or    cs:abort_flag,2
  176.     jmp    writ_exit
  177. write_bypass:
  178.     clc
  179. writ_exit:
  180.     pop    ds
  181.     pop    di
  182.     pop    si
  183.         ret 
  184.  
  185. ;------------------------------
  186. ; look up cluster in fat
  187. ;    INPUTS - ax = fat ptr from dir
  188. ;    OUTPUT - ax = cluster number
  189. ;             bx = next cluster number
  190. ;             es = fat segment
  191. fat_lookup:
  192.     mov    es,cs:fat_segment
  193.     cmp    cs:fat_type,1            ;check if 12-bit fat
  194.     je    twelve_bit_fat            ;jump if 12-bit fat
  195. ;
  196. ; 16-bit fat
  197. ;
  198.     mov    bx,ax                ;get fat ptr (cluster #)
  199.     shl    bx,1                ;convert to word index
  200.     mov    bx,es:[bx]            ;get next fat ptr
  201.     ret
  202. twelve_bit_fat:
  203.     mov    bx,ax
  204.     shr    bx,1
  205.     pushf
  206.     add    bx,ax
  207.     mov    bx,es:[bx]            ;get fat data
  208.     popf                    ;get odd/even state
  209.     jnc    twelve1                ;jump if even fat entry
  210.     shr    bx,1
  211.     shr    bx,1
  212.     shr    bx,1
  213.     shr    bx,1
  214. twelve1:and    bx,0fffh
  215.     jz    twelve3                ;jump if fat=0
  216.     cmp    bx,0ff7h            ;check if end
  217.     jl    twelve3                ;jump if not end of chain
  218.     jne    twelve2                ;jump if end of chain
  219.     mov    bx,0fff7h            ;get locked out cluster code
  220.     jmp    short twelve3
  221. twelve2:
  222.     mov    bx,0ffffh            ;set end of chain state
  223. twelve3:ret
  224. ;-------------------------------
  225. ; fat_write  
  226. ;   INPUTS  -  ax = fat (cluster#)
  227. ;              bx = new data
  228. ;
  229. fat_write:
  230.     push    es
  231.     push    bx
  232.     mov    es,cs:fat_segment
  233.     cmp    cs:fat_type,1            ;check if 12-bit fat
  234.     je    twelv_bit_fat            ;jump if 12-bit fat
  235. ;
  236. ; 16-bit fat
  237. ;
  238.     mov    bx,ax                ;get fat ptr (cluster #)
  239.     shl    bx,1                ;convert to word index
  240.     pop    ax
  241.     mov    es:[bx],ax            ;store new fat ptr
  242.     pop    es
  243.     ret
  244. twelv_bit_fat:
  245.     mov    bx,ax
  246.     shr    bx,1
  247.     pushf                    ;save carry flag
  248.     add    bx,ax                ;compute fat address
  249.     mov    cx,es:[bx]            ;get current fat data
  250.     popf                    ;restore carry flag
  251.     pop    ax                ;restore new fat data
  252.     jnc    twelv1                ;jump if even fat
  253.     and    ax,0fffh            ;force 12bit value
  254.     shl    ax,1
  255.     shl    ax,1
  256.     shl    ax,1
  257.     shl    ax,1
  258.     and    cx,000fh            ;remove old fat data
  259.     or    cx,ax
  260.     mov    es:[bx],cx
  261.     pop    es
  262.     ret
  263. twelv1:
  264.     and    ax,0fffh            ;force 12-bit value
  265.     and    cx,0f000h            ;remove old fat data
  266.     or    cx,ax
  267.     mov    es:[bx],cx
  268.     pop    es
  269.     ret
  270. ;-----------------------------------------------------------------------
  271.